home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1997 #3
/
Amiga Plus CD - 1997 - No. 03.iso
/
pd
/
programmierung
/
alienbreed3d2_src
/
cheesesauce
/
fullscrnwall.s
< prev
next >
Wrap
Text File
|
1997-01-31
|
27KB
|
1,856 lines
leftclip: dc.w 0
rightclip: dc.w 0
deftopclip: dc.w 0
defbotclip: dc.w 0
leftclipandlast: dc.w 0
SCALE MACRO
dc.w 64*0
dc.w 64*1
dc.w 64*1
dc.w 64*2
dc.w 64*2
dc.w 64*3
dc.w 64*3
dc.w 64*4
dc.w 64*4
dc.w 64*5
dc.w 64*5
dc.w 64*6
dc.w 64*6
dc.w 64*7
dc.w 64*7
dc.w 64*8
dc.w 64*8
dc.w 64*9
dc.w 64*9
dc.w 64*10
dc.w 64*10
dc.w 64*11
dc.w 64*11
dc.w 64*12
dc.w 64*12
dc.w 64*13
dc.w 64*13
dc.w 64*14
dc.w 64*14
dc.w 64*15
dc.w 64*15
dc.w 64*16
dc.w 64*16
dc.w 64*17
dc.w 64*17
dc.w 64*18
dc.w 64*18
dc.w 64*19
dc.w 64*19
dc.w 64*20
dc.w 64*20
dc.w 64*21
dc.w 64*21
dc.w 64*22
dc.w 64*22
dc.w 64*23
dc.w 64*23
dc.w 64*24
dc.w 64*24
dc.w 64*25
dc.w 64*25
dc.w 64*26
dc.w 64*26
dc.w 64*27
dc.w 64*27
dc.w 64*28
dc.w 64*28
dc.w 64*29
dc.w 64*29
dc.w 64*30
dc.w 64*30
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
dc.w 64*31
ENDM
***********************************
* The screendivide routine is simpler
* using a0=left pixel
* a2= right pixel
* d0= left dist
* d2= right dist
* d4 = left strip
* d5 = right strip
* (a0)=leftx
* 2(a0)=rightx
* 4(a0)=leftbm
* 6(a0)=rightbm
* 8(a0)=leftdist
* 10(a0)=rightdist
* 12(a0)=lefttop
* 14(a0)=righttop
* 16(a0)=leftbot
* 18(a0)=rightbot
Doleftend:
move.w leftclip,d0
sub.w #1,d0
move.w d0,leftclipandlast
move.w (a0),d0
move.w 2(a0),d1
sub.w d0,d1
bge.s sometodraw
rts
sometodraw:
move.w itertab(pc,d1.w*4),d7
swap d0
move.w itertab+2(pc,d1.w*4),d6
clr.w d0
swap d1
clr.w d1
asr.l d6,d1
move.l d1,(a0)
bra pstit
itertab:
incbin "iterfile"
pstit:
moveq #0,d1
move.w 4(a0),d1
moveq #0,d2
move.w 6(a0),d2
sub.w d1,d2
swap d1
swap d2
asr.l d6,d2
move.l d2,4(a0)
moveq #0,d2
move.w 8(a0),d2
moveq #0,d3
move.w 10(a0),d3
sub.w d2,d3
swap d2
swap d3
asr.l d6,d3
move.l d3,8(a0)
moveq #0,d3
move.w 12(a0),d3
moveq #0,d4
move.w 14(a0),d4
sub.w d3,d4
swap d3
swap d4
asr.l d6,d4
move.l d4,12(a0)
moveq #0,d4
move.w 16(a0),d4
moveq #0,d5
move.w 18(a0),d5
sub.w d4,d5
swap d4
swap d5
asr.l d6,d5
move.l d5,16(a0)
*** Gouraud shading ***
moveq #0,d5
move.w 26(a0),d5
sub.w 24(a0),d5
add.w d5,d5
swap d5
asr.l d6,d5
move.l d5,28(a0)
moveq #0,d5
move.w 24(a0),d5
add.w d5,d5
swap d5
bra screendivide
itercount: dc.w 0
screendividethru:
.scrdrawlop:
move.w (a0)+,d0
move.l FASTBUFFER,a3
move.l (a0)+,d1
bra .pastscrinto
.scrintocop:
incbin "XTOCOPX"
.pastscrinto
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.w d4,d6
add.w d6,a5
move.l (a0)+,d4
swap d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
add.w angbright(pc),d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #32,d6
blt.s .brnotpos
move.w #32,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w .ffscrpickhowbright(pc,d6*2),a2
; and.b #$fe,d6
; add.w .ffscrpickhowbright(pc,d6*2),a4
; btst #0,d0
; beq .nobrightswap
; exg a2,a4
;.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdrawthru
move.w (a7)+,d7
dbra d7,.scrdrawlop
rts
.ffscrpickhowbright:
SCALE
***************************
screendivide:
or.l #$ffff0000,d7
move.w leftclipandlast(pc),d6
move.l #WorkSpace,a2
move.l (a0),a3
move.l 4(a0),a4
move.l 8(a0),a5
move.l 12(a0),a6
move.l 16(a0),a1
move.l 28(a0),a0
scrdivlop:
swap d0
cmp.w d6,d0
bgt scrnotoffleft
swap d0
add.l a4,d1
add.l a5,d2
add.l a6,d3
add.l a1,d4
add.l a3,d0
add.l a0,d5
dbra d7,scrdivlop
rts
scrnotoffleft:
move.w d0,d6
cmp.w rightclip(pc),d0
bge.s outofcalc
scrnotoffright:
move.w d0,(a2)+
move.l d1,(a2)+
move.l d2,(a2)+
move.l d3,(a2)+
move.l d4,(a2)+
move.l d5,(a2)+
swap d0
add.l a3,d0
add.l a4,d1
add.l a5,d2
add.l a6,d3
add.l a1,d4
add.l a0,d5
add.l #$10000,d7
dbra d7,scrdivlop
outofcalc:
swap d7
tst.w d7
bge.s .somethingtodraw
rts
.somethingtodraw:
move.l #consttab,a1
move.l #WorkSpace,a0
; tst.b seethru
; bne screendividethru
scrdrawlop:
move.w (a0)+,d0
move.l FASTBUFFER,a3
lea (a3,d0.w*2),a3
move.l (a0)+,d1
; bra pastscrinto
;
;
;pastscrinto
swap d1
move.w d1,d6
and.w HORAND,d6
move.l (a0)+,d2
swap d2
add.w fromtile(pc),d6
add.w d6,d6
move.w d6,a5
move.l (a0)+,d3
swap d3
add.l #divthreetab,a5
move.w (a5),StripData
move.l ChunkAddr,a5
moveq #0,d6
move.b StripData,d6
add.w d6,d6
move.w VALSHIFT,d4
asl.w d4,d6
add.w d6,a5
move.l (a0)+,d4
swap d4
move.w d2,d6
***************************
* old version
asr.w #7,d6
***************************
; asr.w #3,d6
; sub.w #4,d6
; cmp.w #6,d6
; blt.s tstbrbr
; move.w #6,d6
;tstbrbr:
***************************
move.l (a0)+,d5
swap d5
ext.w d5
add.w d5,d6
bge.s .brnotneg
moveq #0,d6
.brnotneg
cmp.w #64,d6
blt.s .brnotpos
move.w #64,d6
.brnotpos
move.l PaletteAddr,a2
move.l a2,a4
add.w ffscrpickhowbright(pc,d6*2),a2
and.b #$fe,d6
add.w ffscrpickhowbright(pc,d6*2),a4
btst #0,d0
beq .nobrightswap
exg a2,a4
.nobrightswap:
move.w d7,-(a7)
bsr ScreenWallstripdraw
move.w (a7)+,d7
toosmall:
dbra d7,scrdrawlop
rts
middleline:
dc.w 0
;scrintocop:
; incbin "XTOCOPX"
prot4: dc.w 0
fromtile: dc.l 0
fromquartertile: dc.l 0
swapbrights: dc.w 0
angbright: dc.w 0
leftside: dc.b 0
rightside: dc.b 0
firstleft: dc.w 0
ffscrpickhowbright:
SCALE
divthreetab:
val SET 0
REPT 130
dc.b val,0
dc.b val,1
dc.b val,2
val SET val+1
ENDR
StripData: dc.w 0
* using a0=left pixel
* a2= right pixel
* d0= left height
* d2= right height
* d4 = left strip
* d5 = right strip
* Routine to draw a wall;
* pass it X and Z coords of the endpoints
* and the start and end length, and a number
* representing the number of the wall.
* a0=x1 d1=z1 a2=x2 d3=z2
* d4=sl d5=el
* a1 = strip buffer
store: ds.l 500
******************************************************************
* Curve drawing routine. We have to know:
* The top and bottom of the wall
* The point defining the centre of the arc
* the point defining the starting point of the arc
* the start and end angles of the arc
* The start and end positions along the bitmap of the arc
* Which bitmap to use for the arc
xmiddle: dc.w 0
zmiddle SET 2
dc.w 0
xradius SET 4
dc.w 0
zradius SET 6
dc.w 0
startbitmap SET 8
dc.w 0
bitmapcounter SET 10
dc.w 0
brightmult SET 12
dc.w 0
angadd SET 14
dc.l 0
xmiddlebig SET 18
dc.l 0
basebright SET 22
dc.w 0
shift SET 24
dc.w 0
count SET 26
dc.w 0
subdividevals:
dc.w 2,4
dc.w 3,8
dc.w 4,16
dc.w 5,32
dc.w 6,64
CurveDraw:
move.w (a0)+,d0 ; centre of rotation
move.w (a0)+,d1 ; point on arc
move.l #Rotated,a1
move.l #xmiddle,a2
move.l (a1,d0.w*8),d2
move.l d2,18(a2)
asr.l #7,d2
move.l (a1,d1.w*8),d4
asr.l #7,d4
sub.w d2,d4
move.w d2,(a2)
move.w d4,4(a2)
move.w 6(a1,d0.w*8),d2
move.w 6(a1,d1.w*8),d4
sub.w d2,d4
move.w d2,2(a2)
asr.w #1,d4
move.w d4,6(a2)
move.w (a0)+,d4 ; start of bitmap
move.w (a0)+,d5 ; end of bitmap
move.w d4,8(a2)
sub.w d4,d5
move.w d5,10(a2)
move.w (a0)+,d4
ext.l d4
move.l d4,14(a2)
move.w (a0)+,d4
move.l #subdividevals,a3
move.l (a3,d4.w*4),shift(a2)
move.l #walltiles,a3
add.l (a0)+,a3
adda.w wallyoff,a3
move.l a3,fromtile
move.w (a0)+,basebright(a2)
move.w (a0)+,brightmult(a2)
move.l (a0)+,topofwall
move.l (a0)+,botofwall
move.l yoff,d6
sub.l d6,topofwall
sub.l d6,botofwall
move.l #databuffer,a1
move.l #SineTable,a3
lea 2048(a3),a4
moveq #0,d0
moveq #0,d1
move.w count(a2),d7
DivideCurve
move.l d0,d2
move.w shift(a2),d4
asr.l d4,d2
move.w (a3,d2.w*2),d4
move.w d4,d5
move.w (a4,d2.w*2),d3
move.w d3,d6
muls.w 4(a2),d3
muls.w 6(a2),d4
muls.w 4(a2),d5
muls.w 6(a2),d6
sub.l d4,d3
add.l d6,d5
asl.l #2,d5
asr.l #8,d3
add.l 18(a2),d3
swap d5
move.w basebright(a2),d6
move.w brightmult(a2),d4
muls d5,d4
swap d4
add.w d4,d6
add.w 2(a2),d5
move.l d3,(a1)+
move.w d5,(a1)+
move.w d1,d2
move.w shift(a2),d4
asr.w d4,d2
add.w 8(a2),d2
move.w d2,(a1)+
move.w d6,(a1)+
add.l 14(a2),d0
add.w 10(a2),d1
dbra d7,DivideCurve
move.l a0,-(a7)
; move.w #31,d6
; move.l #0,d3
; move.l #stripbuffer,a4
;.emptylop:
; move.l d3,(a4)+
; dbra d6,.emptylop
bsr curvecalc
move.l (a7)+,a0
rts
prot3: dc.w 0
curvecalc:
move.l #databuffer,a1
move.w count(a2),d7
subq #1,d7
.findfirstinfront:
move.l (a1)+,d1
move.w (a1)+,d0
bgt.s .foundinfront
move.w (a1)+,d4
move.w (a1)+,d6
dbra d7,.findfirstinfront
; CACHE_ON d2
rts ; no two points were in front
.foundinfront:
move.w (a1)+,d4
move.w (a1)+,d6
; d1=left x, d4=left end, d0=left dist
; d6=left angbright
divs d0,d1
add.w #MIDDLEX,d1
move.l topofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strtop
move.l botofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strbot
; CACHE_OFF d2
.computeloop:
move.w 4(a1),d2
bgt.s .infront
; addq #8,a1
; dbra d7,.findfirstinfront
; CACHE_ON d2
rts
.infront:
move.l #store,a0
move.l (a1),d3
move.w 6(a1),d5
add.w 8(a1),d6
asr.w #1,d6
move.w d6,angbright
divs d2,d3
add.w #MIDDLEX,d3
move.w strtop(pc),12(a0)
move.w strbot(pc),16(a0)
move.l topofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strtop
move.w d6,14(a0)
move.l botofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strbot
move.w d6,18(a0)
move.w d3,2(a1)
blt.s .alloffleft
cmp.w #RIGHTX,d1
bgt.s .alloffleft
cmp.w d1,d3
blt.s .alloffleft
move.w d1,(a0)
move.w d3,2(a0)
move.w d4,4(a0)
move.w d5,6(a0)
move.w d0,8(a0)
move.w d2,10(a0)
move.w d7,-(a7)
move.w #maxscrdiv,d7
bsr Doleftend
move.w (a7)+,d7
.alloffleft:
move.l (a1)+,d1
move.w (a1)+,d0
move.w (a1)+,d4
move.w (a1)+,d6
dbra d7,.computeloop
.alloffright:
; CACHE_ON d2
rts
;protcheck:
; sub.l #53624,a3
; add.l #2345215,a2
; lea passspace-$30000(pc),a1
; add.l #$30000,a1
; lea startpass(pc),a5
; move.w #endpass-startpass-1,d1
;copypass:
; move.b (a5)+,(a1)+
; dbra d1,copypass
; sub.l a5,a5
; lea passspace-$30000(pc),a1
; add.l #$30000,a1
; jsr (a1)
; lea passspace-$30000(pc),a1
; add.l #$30000,a1
; lea startpass(pc),a5
; move.w #(endpass-startpass)/2-1,d1
;erasepass:
; move.w -(a5),(a1)+
; dbra d1,erasepass
; sub.l a5,a5
; sub.l a1,a1
; eor.l #$af594c72,d0
; sub.l #123453986,a4
; move.l d0,(a4)
; add.l #123453986,a4
; move.l #0,d0
; sub.l #2345215,a2
; jsr (a2)
; sub.l a2,a2
; eor.l #$af594c72,d0
; sub.l #123453986,a4
; move.l (a4),d1
; add.l #123453986,a4
; cmp.l d1,d0
; bne.s notrightt
; add.l #53624,a3
; move.w #9,d7
;sayitsok:
; move.l (a3)+,a2
; add.l #78935450,a2
; st (a2)
; dbra d7,sayitsok
;notrightt:
; sub.l a3,a3
;nullit:
; rts
;
; incbin "ab3:includes/protroutencoded"
endprot:
******************************************************************
iters: dc.w 0
multcount: dc.w 0
walldraw:
tst.w d1
bgt.s oneinfront1
tst.w d3
bgt.s oneinfront
rts
oneinfront1
tst.w d3
ble.s oneinfront
; Bothinfront!
nop
oneinfront
move.w #32,d7
move.w #3,d6
move.w d3,d0
sub.w d1,d0
bge.s notnegzdiff
neg.w d0
notnegzdiff
; cmp.w #1024,d0
; blt.s nd01
; add.w d7,d7
; add.w #1,d6
;nd01:
cmp.w #512,d0
blt.s nd0
add.w d7,d7
add.w #1,d6
bra nha
nd0:
cmp.w #256,d0
bgt.s nh1
asr.w #1,d7
subq #1,d6
nh1:
cmp.w #128,d0
bgt.s nh2
asr.w #1,d7
subq #1,d6
nh2:
nha:
move.w d3,d0
cmp.w d1,d3
blt.s rightnearest
move.w d1,d0
rightnearest:
cmp.w #64,d0
bgt.s nd1
addq #1,d6
add.w d7,d7
nd1:
cmp.w #128,d0
blt.s nh3
asr.w #1,d7
subq #1,d6
blt.s nh3
cmp.w #256,d0
blt.s nh3
asr.w #1,d7
subq #1,d6
nh3:
move.w d6,iters
subq #1,d7
move.w d7,multcount
move.l #databuffer,a3
move.l a0,d0
move.l a2,d2
move.l d0,(a3)+
add.l d2,d0
move.w d1,(a3)+
asr.l #1,d0
move.w d4,(a3)+
move.w leftwallbright,d6
move.w d6,(a3)+
add.w d5,d4
move.l d0,(a3)+
add.w d3,d1
asr.w #1,d1
move.w d1,(a3)+
asr.w #1,d4
move.w d4,(a3)+
add.w rightwallbright,d6
asr.w #1,d6
move.w d6,(a3)+
move.l d2,(a3)+
move.w d3,(a3)+
move.w d5,(a3)+
move.w rightwallbright,(a3)+
; We now have the two endpoints and the midpoint
; so we need to perform 1 iteration of the inner
; loop, the first time.
* Decide how often to subdivide by how far away the wall is, and
* how perp. it is to the player.
move.l #databuffer,a0
move.l #databuffer2,a1
move.w iters,d6
blt noiters
move.l #1,a2
iterloop:
move.l a0,a3
move.l a1,a4
move.w a2,d7
exg a0,a1
move.l (a3)+,d0
move.w (a3)+,d1
move.l (a3)+,d2
middleloop:
move.l d0,(a4)+
move.l (a3)+,d3
add.l d3,d0
move.w d1,(a4)+
asr.l #1,d0
move.w (a3)+,d4
add.w d4,d1
move.l d2,(a4)+
asr.w #1,d1
move.l (a3)+,d5
add.l d5,d2
move.l d0,(a4)+
asr.l #1,d2
move.w d1,(a4)+
move.l d2,(a4)+
move.l d3,(a4)+
move.l (a3)+,d0
add.l d0,d3
move.w d4,(a4)+
asr.l #1,d3
move.w (a3)+,d1
add.w d1,d4
move.l d5,(a4)+
asr.w #1,d4
move.l (a3)+,d2
add.l d2,d5
move.l d3,(a4)+
asr.l #1,d5
move.w d4,(a4)+
move.l d5,(a4)+
subq #1,d7
bgt.s middleloop
move.l d0,(a4)+
move.w d1,(a4)+
move.l d2,(a4)+
add.w a2,a2
dbra d6,iterloop
noiters:
CalcAndDraw:
; CACHE_ON d2
move.l a0,a1
move.w multcount,d7
.findfirstinfront:
move.l (a1)+,d1
move.w (a1)+,d0
bgt.s .foundinfront
move.l (a1)+,d4
dbra d7,.findfirstinfront
rts ; no two points were in front
.foundinfront:
move.w (a1)+,d4
move.w (a1)+,lbr
; d1=left x, d4=left end, d0=left dist
divs d0,d1
add.w #MIDDLEX,d1
move.l topofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strtop
move.l botofwall(pc),d5
divs d0,d5
add.w MIDDLEY,d5
move.w d5,strbot
.computeloop:
move.w 4(a1),d2
bgt.s .infront
rts
.infront:
move.l #store,a0
move.l (a1),d3
divs d2,d3
move.w 6(a1),d5
add.w #MIDDLEX,d3
move.w strtop(pc),12(a0)
move.l topofwall(pc),d6
divs d2,d6
move.w strbot(pc),16(a0)
add.w MIDDLEY,d6
move.w d6,strtop
move.w d6,14(a0)
move.l botofwall(pc),d6
divs d2,d6
add.w MIDDLEY,d6
move.w d6,strbot
move.w d6,18(a0)
move.w d3,2(a1)
cmp.w leftclip(pc),d3
blt.s .alloffleft
cmp.w rightclip(pc),d1
; cmp.w #95,d1
bge.s .alloffright
move.w d1,(a0)
move.w d3,2(a0)
move.w d4,4(a0)
move.w d5,6(a0)
move.w d0,8(a0)
move.w d2,10(a0)
move.w lbr,d5
sub.w #300,d5
ext.w d5
move.w d5,24(a0)
move.w 8(a1),d5
sub.w #300,d5
ext.w d5
move.w d5,26(a0)
movem.l d7/a1,-(a7)
move.w #maxscrdiv,d7
bsr Doleftend
movem.l (a7)+,d7/a1
.alloffleft:
move.l (a1)+,d1
move.w (a1)+,d0
move.w (a1)+,d4
move.w (a1)+,lbr
dbra d7,.computeloop
rts
.alloffright:
rts
lbr: dc.w 0
leftwallbright: dc.w 0
rightwallbright: dc.w 0
strtop: dc.w 0
strbot: dc.w 0
databuffer:
ds.l 1200
databuffer2:
ds.l 1200
***********************************
* Need a routine which takes...?
* Top Y (3d)
* Bottom Y (3d)
* distance
* height of each tile (number and routine addr)
* And produces the appropriate strip on the
* screen.
topofwall: dc.l 0
botofwall: dc.l 0
nostripq:
rts
ScreenWallstripdraw:
move.w d4,d6
cmp.w topclip(pc),d6
blt.s nostripq
cmp.w botclip(pc),d3
bgt.s nostripq
cmp.w botclip(pc),d6
ble.s noclipbot
move.w botclip(pc),d6
noclipbot:
move.w d3,d5
cmp.w topclip(pc),d5
bge.s nocliptop
move.w topclip(pc),d5
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
sub.w d5,d6 ; height to draw.
ble.s nostripq
bra gotoend
nocliptop:
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
sub.w d5,d6 ; height to draw.
ble.s nostripq
bra gotoend
wlcnt: dc.w 0
CNOP 0,4
drawwalldimPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
add.l d3,d4
move.w (a4,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwallPACK0
rts
CNOP 0,128
drawwallPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
add.l d3,d4
move.w (a2,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwalldimPACK0
nostrip:
rts
CNOP 0,4
drawwalldimPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
add.l d3,d4
move.w (a4,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwallPACK1
rts
CNOP 0,4
drawwallPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
add.l d3,d4
move.w (a2,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwalldimPACK1
rts
CNOP 0,4
drawwalldimPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
add.l d3,d4
move.w (a4,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwallPACK2
rts
CNOP 0,4
drawwallPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
add.l d3,d4
move.w (a2,d1.w*2),(a3)
adda.w d0,a3
addx.w d2,d4
dbra d6,drawwalldimPACK2
rts
usesimple:
mulu d3,d4
add.l d0,d4
swap d4
add.w totalyoff(pc),d4
cliptopusesimple
move.w VALAND,d7
move.w #320*2,d0
moveq #0,d1
cmp.l a4,a2
blt.s usea2
move.l a4,a2
usea2:
and.w d7,d4
move.l d2,d5
clr.w d5
cmp.b #1,StripData+1
dbge d6,simplewalliPACK0
dbne d6,simplewalliPACK1
dble d6,simplewalliPACK2
rts
CNOP 0,4
simplewalliPACK0:
move.b 1(a5,d4.w*2),d1
and.b #31,d1
move.w (a2,d1.w*2),d3
simplewallPACK0:
move.w d3,(a3)
adda.w d0,a3
add.l d2,d4
bcc.s .noread
addq #1,d4
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
move.w (a2,d1.w*2),d3
.noread:
dbra d6,simplewallPACK0
rts
CNOP 0,4
simplewalliPACK1:
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
move.w (a2,d1.w*2),d3
simplewallPACK1:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s .noread
addq #1,d4
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
move.w (a2,d1.w*2),d3
.noread:
dbra d6,simplewallPACK1
rts
CNOP 0,4
simplewalliPACK2:
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
move.w (a2,d1.w*2),d3
simplewallPACK2:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s .noread
addq #1,d4
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
move.w (a2,d1.w*2),d3
.noread:
dbra d6,simplewallPACK2
rts
;gotoendnomult:
; movem.l d0/d1/d2/d3/d4/d7,-(a7)
; add.l timeslarge(pc,d5.w*4),a3
; move.w d5,d4
; move.l 4(a1,d2.w*8),d0
; move.l (a1,d2.w*8),d2
; moveq #0,d3
; move.w d2,d3
; swap d2
; tst.w d2
; move.w wallyoff(pc),d4
; add.w #44,d4
; bne.s .notsimple
; cmp.l #$b000,d3
; ble cliptopusesimple
;.notsimple:
; bra cliptop
MIDDLEY: dc.w 120
BIGMIDDLEY: dc.l 320*2*120
TOPOFFSET: dc.w 0
SMIDDLEY: dc.w 120
SBIGMIDDLEY: dc.l 320*2*120
STOPOFFSET: dc.w 0
gotoend:
add.l timeslarge(pc,d5.w*4),a3
move.w d2,d4
add.w d2,d2
add.w d2,d4
move.l 4(a1,d4.w*8),d0
add.w TOPOFFSET(pc),d5
move.w d5,d4
move.l (a1,d2.w*4),d2
moveq #0,d3
move.w d2,d3
swap d2
tst.w d2
bne.s .notsimple
cmp.l #$b000,d3
ble usesimple
.notsimple:
mulu d3,d4
muls d2,d5
add.l d0,d4
swap d4
add.w d5,d4
add.w totalyoff(pc),d4
cliptop
move.w VALAND,d7
and.w d7,d4
move.w #320*2,d0
moveq #0,d1
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallPACK0
dbne d6,drawwallPACK1
dble d6,drawwallPACK2
rts
timeslarge:
val SET 0
REPT 256
dc.l val
val SET val+320*2
ENDR
ds.l 100
nostripqthru:
rts
ScreenWallstripdrawthru:
move.w d4,d6
cmp.w topclip(pc),d6
blt.s nostripqthru
cmp.w botclip(pc),d3
bgt.s nostripqthru
cmp.w botclip(pc),d6
ble.s .noclipbot
move.w botclip(pc),d6
.noclipbot:
move.w d3,d5
cmp.w topclip(pc),d5
bge.s .nocliptop
move.w topclip(pc),d5
btst #0,d5
beq.s .nsbd
exg a2,a4
.nsbd:
sub.w d5,d6 ; height to draw.
ble.s nostripqthru
bra gotoendthru
.nocliptop:
btst #0,d5
beq.s .nsbdthru
exg a2,a4
.nsbdthru:
sub.w d5,d6 ; height to draw.
ble.s nostripqthru
bra gotoendthru
CNOP 0,4
drawwalldimthruPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
beq.s .holey
move.w (a4,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwallthruPACK0
rts
CNOP 0,4
drawwallthruPACK0:
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
beq.s .holey
move.w (a2,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwalldimthruPACK0
nostripthru:
rts
CNOP 0,4
drawwalldimthruPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
beq.s .holey
move.w (a4,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwallthruPACK1
rts
CNOP 0,4
drawwallthruPACK1:
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
beq.s .holey
move.w (a2,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwalldimthruPACK1
rts
CNOP 0,4
drawwalldimthruPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
beq.s .holey
move.w (a4,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwallthruPACK2
rts
CNOP 0,4
drawwallthruPACK2:
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
beq.s .holey
move.w (a2,d1.w*2),(a3)
.holey:
adda.w d0,a3
add.l d3,d4
addx.w d2,d4
dbra d6,drawwalldimthruPACK2
rts
usesimplethru:
mulu d3,d4
add.l d0,d4
swap d4
add.w totalyoff(pc),d4
cliptopusesimplethru
moveq #63,d7
move.w #104*4,d0
moveq #0,d1
cmp.l a4,a2
blt.s usea2thru
move.l a4,a2
usea2thru:
and.w d7,d4
move.l d2,d5
clr.w d5
cmp.b #1,StripData+1
dbge d6,simplewallthruiPACK0
dbne d6,simplewallthruiPACK1
dble d6,simplewallthruiPACK2
rts
CNOP 0,4
simplewallthruiPACK0:
move.b 1(a5,d4.w*2),d1
and.b #31,d1
move.w (a2,d1.w*2),d3
simplewallthruPACK0:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s noreadthruPACK0
maybeholePACK0
addx.w d2,d4
and.w d7,d4
move.b 1(a5,d4.w*2),d1
and.b #31,d1
beq.s holeysimplePACK0
move.w (a2,d1.w*2),d3
dbra d6,simplewallthruPACK0
rts
noreadthruPACK0:
addx.w d2,d4
dbra d6,simplewallthruPACK0
rts
CNOP 0,4
simplewallholePACK0:
adda.w d0,a3
add.l d5,d4
bcs.s maybeholePACK0
addx.w d2,d4
holeysimplePACK0
and.w d7,d4
dbra d6,simplewallholePACK0
rts
CNOP 0,4
simplewallthruiPACK1:
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
move.w (a2,d1.w*2),d3
simplewallthruPACK1:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s noreadthruPACK1
maybeholePACK1
addx.w d2,d4
and.w d7,d4
move.w (a5,d4.w*2),d1
lsr.w #5,d1
and.w #31,d1
beq.s holeysimplePACK1
move.w (a2,d1.w*2),d3
dbra d6,simplewallthruPACK1
rts
noreadthruPACK1:
addx.w d2,d4
dbra d6,simplewallthruPACK1
rts
CNOP 0,4
simplewallholePACK1:
adda.w d0,a3
add.l d5,d4
bcs.s maybeholePACK1
addx.w d5,d4
holeysimplePACK1
and.w d7,d4
dbra d6,simplewallholePACK1
rts
CNOP 0,4
simplewallthruiPACK2:
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
move.w (a2,d1.w*2),d3
simplewallthruPACK2:
move.w d3,(a3)
adda.w d0,a3
add.l d5,d4
bcc.s noreadthruPACK2
maybeholePACK2
addx.w d2,d4
and.w d7,d4
move.b (a5,d4.w*2),d1
lsr.b #2,d1
and.b #31,d1
beq.s holeysimplePACK2
move.w (a2,d1.w*2),d3
dbra d6,simplewallthruPACK2
rts
noreadthruPACK2:
addx.w d2,d4
dbra d6,simplewallthruPACK2
rts
CNOP 0,4
simplewallholePACK2
adda.w d0,a3
add.l d5,d4
bcs.s maybeholePACK2
addx.w d2,d4
holeysimplePACK2
and.w d7,d4
dbra d6,simplewallholePACK2
rts
gotoendthru:
add.l timeslargethru(pc,d5.w*4),a3
move.w d5,d4
move.l 4(a1,d2.w*8),d0
move.l (a1,d2.w*8),d2
moveq #0,d3
move.w d2,d3
swap d2
tst.w d2
bne.s .notsimple
cmp.l #$b000,d3
ble usesimplethru
.notsimple:
mulu d3,d4
muls d2,d5
add.l d0,d4
swap d4
add.w d5,d4
add.w wallyoff(pc),d4
cliptopthru
moveq #63,d7
move.w #104*4,d0
moveq #0,d1
move.l d2,d3
clr.w d3
cmp.b #1,StripData+1
dbge d6,drawwallthruPACK0
dbne d6,drawwallthruPACK1
dble d6,drawwallthruPACK2
rts
timeslargethru:
val SET 104*4
REPT 80
dc.l val
val SET val+104*4
ENDR
totalyoff: dc.w 0
wallyoff: dc.w 0
******************************************
* Wall polygon
leftend: dc.w 0
wallbrightoff: dc.w 0
itsawalldraw:
move.l #Rotated,a5
move.l #OnScreen,a6
move.w (a0)+,d0
move.w (a0)+,d2
move.w (a0)+,leftend
move.w (a0)+,d5
move.w (a0)+,d1
asl.w #4,d1
move.w d1,fromtile
move.w (a0)+,d1
move.w d1,totalyoff
move.w (a0)+,d1
move.l #walltiles,a3
move.l (a3,d1.w*4),a3
move.l a3,PaletteAddr
add.l #64*32,a3
move.l a3,ChunkAddr
;move.w (a0)+,d1
;add.w ZoneBright,d1
move.w ZoneBright,angbright
;move.w (a0)+,d1
;move.w (a0)+,d4
move.l yoff,d6
move.b (a0)+,VALAND+1
move.b (a0)+,VALSHIFT+1
move.w (a0)+,HORAND
move.w totalyoff,d1
add.w wallyoff,d1
and.w VALAND,d1
move.w d1,totalyoff
move.l (a0)+,topofwall
sub.l d6,topofwall
move.l (a0)+,botofwall
sub.l d6,botofwall
move.w (a0)+,wallbrightoff
move.l topofwall,d3
cmp.l botofwall,d3
bge wallfacingaway
tst.w 6(a5,d0*8)
bgt.s cantell
tst.w 6(a5,d2*8)
ble wallfacingaway
bra cliptotestfirstbehind
cantell:
tst.w 6(a5,d2*8)
ble.s cliptotestsecbehind
bra pastclip
cliptotestfirstbehind:
move.l (a5,d0*8),d3
sub.l (a5,d2*8),d3
move.w 6(a5,d0*8),d6
sub.w 6(a5,d2*8),d6
divs d6,d3
muls 6(a5,d2*8),d3
neg.l d3
add.l (a5,d2*8),d3
move.w (a6,d2*2),d6
sub.w #MIDDLEX,d6
ext.l d6
cmp.l d6,d3
bge wallfacingaway
bra cant_tell
bra pastclip
cliptotestsecbehind:
move.l (a5,d2*8),d3
sub.l (a5,d0*8),d3
move.w 6(a5,d2*8),d6
sub.w 6(a5,d0*8),d6
divs d6,d3
muls 6(a5,d0*8),d3
neg.l d3
add.l (a5,d0*8),d3
move.w (a6,d0*2),d6
sub.w #MIDDLEX,d6
ext.l d6
cmp.l d6,d3
ble wallfacingaway
bra cant_tell
pastclip:
move.w (a6,d0*2),d3
cmp.w #RIGHTX,d3
bgt wallfacingaway
cmp.w (a6,d2*2),d3
bge wallfacingaway
tst.w (a6,d2*2)
blt.s wallfacingaway
cant_tell:
; move.l a1,a4
; move.w #31,d6
; move.l #0,d3
;.emptylop:
; move.l d3,(a4)+
; dbra d6,.emptylop
; move.w rightclip(pc),d6
; st (a1,d6)
; move.w leftclip(pc),d6
; st -1(a1,d6)
; muls sinval(pc),d1
; muls cosval(pc),d4
; add.l d1,d4
; add.l d4,d4
; swap d4
; neg.w d4
; move.w d4,d6
; asr.w #1,d4
; sub.w d4,angbright
; and.b #$fe,d4
; asl.w #2,d4
; asl.w #2,d6
movem.l d7/a0/a5/a6,-(a7)
move.l (a5,d0*8),a0
; add.l a0,a0
move.w 6(a5,d0*8),d1
move.l (a5,d2*8),a2
; add.l a2,a2
move.w 6(a5,d2*8),d3
move.l PointBrightsPtr,a5
move.w (a5,d0.w*4),d0
add.w #300,d0
add.w wallbrightoff,d0
move.w d0,leftwallbright
move.w (a5,d2.w*4),d0
add.w #300,d0
add.w wallbrightoff,d0
move.w d0,rightwallbright
move.w leftend(pc),d4
move.l #max3ddiv,d7
bsr walldraw
movem.l (a7)+,d7/a0/a5/a6
wallfacingaway:
rts
PointBrightsPtr: dc.l 0
midpt: dc.l 0
dist1: dc.l 0
dist2: dc.l 0
VALAND: dc.w 0
VALSHIFT: dc.w 0
HORAND: dc.w 0
sinval: dc.w 0
cosval: dc.w 0
oldxoff: dc.w 0
oldzoff: dc.w 0
topclip: dc.w 0
botclip: dc.w 0
seethru: dc.w 0